package patterns.creational.abstractfactory;

/**
 * 抽象工厂模式示例
 * 提供一个创建一系列相关或相互依赖对象的接口，而无需指定它们具体的类
 */
public class AbstractFactoryPattern {

    public static void main(String[] args) {
        // 使用现代风格的家具工厂
        System.out.println("===== 现代风格家具 =====");
        FurnitureFactory modernFactory = new ModernFurnitureFactory();
        
        Chair modernChair = modernFactory.createChair();
        Table modernTable = modernFactory.createTable();
        Sofa modernSofa = modernFactory.createSofa();
        
        modernChair.sitOn();
        modernTable.putOn("笔记本电脑");
        modernSofa.lieOn();
        
        // 使用古典风格的家具工厂
        System.out.println("\n===== 古典风格家具 =====");
        FurnitureFactory victorianFactory = new VictorianFurnitureFactory();
        
        Chair victorianChair = victorianFactory.createChair();
        Table victorianTable = victorianFactory.createTable();
        Sofa victorianSofa = victorianFactory.createSofa();
        
        victorianChair.sitOn();
        victorianTable.putOn("茶杯");
        victorianSofa.lieOn();
        
        // 使用工业风格的家具工厂
        System.out.println("\n===== 工业风格家具 =====");
        FurnitureFactory industrialFactory = new IndustrialFurnitureFactory();
        
        Chair industrialChair = industrialFactory.createChair();
        Table industrialTable = industrialFactory.createTable();
        Sofa industrialSofa = industrialFactory.createSofa();
        
        industrialChair.sitOn();
        industrialTable.putOn("工具箱");
        industrialSofa.lieOn();
    }
}

/**
 * 抽象产品：椅子
 */
interface Chair {
    void sitOn();
}

/**
 * 抽象产品：桌子
 */
interface Table {
    void putOn(String item);
}

/**
 * 抽象产品：沙发
 */
interface Sofa {
    void lieOn();
}

/**
 * 抽象工厂：家具工厂
 */
interface FurnitureFactory {
    Chair createChair();
    Table createTable();
    Sofa createSofa();
}

/**
 * 具体产品：现代风格椅子
 */
class ModernChair implements Chair {
    @Override
    public void sitOn() {
        System.out.println("坐在简约流线型的现代椅子上");
    }
}

/**
 * 具体产品：现代风格桌子
 */
class ModernTable implements Table {
    @Override
    public void putOn(String item) {
        System.out.println("在玻璃材质的现代桌子上放置" + item);
    }
}

/**
 * 具体产品：现代风格沙发
 */
class ModernSofa implements Sofa {
    @Override
    public void lieOn() {
        System.out.println("躺在舒适的现代沙发上");
    }
}

/**
 * 具体工厂：现代风格家具工厂
 */
class ModernFurnitureFactory implements FurnitureFactory {
    @Override
    public Chair createChair() {
        return new ModernChair();
    }
    
    @Override
    public Table createTable() {
        return new ModernTable();
    }
    
    @Override
    public Sofa createSofa() {
        return new ModernSofa();
    }
}

/**
 * 具体产品：维多利亚风格椅子
 */
class VictorianChair implements Chair {
    @Override
    public void sitOn() {
        System.out.println("坐在雕花木质的维多利亚椅子上");
    }
}

/**
 * 具体产品：维多利亚风格桌子
 */
class VictorianTable implements Table {
    @Override
    public void putOn(String item) {
        System.out.println("在古典雕花的维多利亚桌子上放置" + item);
    }
}

/**
 * 具体产品：维多利亚风格沙发
 */
class VictorianSofa implements Sofa {
    @Override
    public void lieOn() {
        System.out.println("躺在华丽的维多利亚沙发上");
    }
}

/**
 * 具体工厂：维多利亚风格家具工厂
 */
class VictorianFurnitureFactory implements FurnitureFactory {
    @Override
    public Chair createChair() {
        return new VictorianChair();
    }
    
    @Override
    public Table createTable() {
        return new VictorianTable();
    }
    
    @Override
    public Sofa createSofa() {
        return new VictorianSofa();
    }
}

/**
 * 具体产品：工业风格椅子
 */
class IndustrialChair implements Chair {
    @Override
    public void sitOn() {
        System.out.println("坐在金属框架的工业风椅子上");
    }
}

/**
 * 具体产品：工业风格桌子
 */
class IndustrialTable implements Table {
    @Override
    public void putOn(String item) {
        System.out.println("在粗犷的工业风桌子上放置" + item);
    }
}

/**
 * 具体产品：工业风格沙发
 */
class IndustrialSofa implements Sofa {
    @Override
    public void lieOn() {
        System.out.println("躺在皮革与金属结合的工业风沙发上");
    }
}

/**
 * 具体工厂：工业风格家具工厂
 */
class IndustrialFurnitureFactory implements FurnitureFactory {
    @Override
    public Chair createChair() {
        return new IndustrialChair();
    }
    
    @Override
    public Table createTable() {
        return new IndustrialTable();
    }
    
    @Override
    public Sofa createSofa() {
        return new IndustrialSofa();
    }
} 